package br.uff.probabilidade.modelo.arvore;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.util.Vector;

import br.uff.probabilidade.modelo.Evento;

public abstract class No {
	private static final int ESPACO_X = 100;
	private static final int ESPACO_Y = 60;
	protected int raio = 6;
	private No pai;
	private Vector filhos = new Vector();		
	
	protected Point posicao;
	
	protected void desenhaFilhos(Graphics g){
		int nivel = this.contaNivel();
		int y0 = this.posicao.y - ((this.ESPACO_Y-(nivel+1)*10) * (this.numeroFilhos()-1)/2);
		Point local;
		for(int i=0;i<this.numeroFilhos();i++){
			local =new Point(this.posicao.x+ESPACO_X,y0+(this.ESPACO_Y-(nivel+1)*10)*i);
			this.getFilhoAt(i).setPosicao(local);
			this.getFilhoAt(i).desenha(g);
			g.drawLine(this.posicao.x+raio/2, this.posicao.y+raio/2, local.x+raio/2, local.y);
		}
		
	}
	
	abstract public void desenha(Graphics g);
	
	
	public No(No pai,Point posicao){
		this.pai = pai;
		this.posicao = posicao;
	}
	
	public No(Point posicao){ //Instancia um no raiz		
		this.posicao = posicao;
	}
	
	public No getFilhoAt(int i){
		return (No)this.filhos.get(i); 
	}
	
	public int numeroFilhos(){
		return filhos.size();
	}
	
	public void adicionaFilho(No filho){
		filho.pai = this;
		this.filhos.add(filho);
	}

	public No getPai() {
		return pai;
	}

	
	public boolean isFolha(){
		return this.filhos.size()==0;
	}
	
	public boolean isRaiz(){
		return this.pai ==null;
	}

	public void setPosicao(Point posicao) {
		this.posicao = posicao;
	}	
	
	
	
	public int contaNivel(){
		int nivel = 0;
		No no = this;
		while(!no.isRaiz()){
			nivel++;
			no = no.getPai();
		}
		return nivel;
	}
	
}
